﻿using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore;
using YDT_ProductService.Domains.Entities;

namespace YDT_ProductService.Infrastructure.Datas
{
    /// <summary>
    /// 商品微服务上下文
    /// </summary>
    public class ProductServiceDbContext : DbContext
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public ProductServiceDbContext(DbContextOptions<ProductServiceDbContext> options) : base(options) { }

        /// <summary>商品表</summary>
        public DbSet<Product> Products { get; set; }
        /// <summary>商品图片表</summary>
        public DbSet<ProductImage> ProductImages { get; set; }

        /// <summary>
        /// 配置模型 - 定义数据库表结构和关系
        /// </summary>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // 配置商品实体
            modelBuilder.Entity<Product>(entity =>
            {
                // 主键配置
                entity.HasKey(e => e.Id);

                // 属性配置
                entity.Property(e => e.ProductCode)
                    .IsRequired()
                    .HasMaxLength(50); // 商品编码最大长度50

                entity.Property(e => e.ProductTitle)
                    .IsRequired()
                    .HasMaxLength(200); // 商品标题最大长度200

                entity.Property(e => e.ProductDescription)
                    .HasColumnType("text"); // 商品描述使用text类型

                entity.Property(e => e.ProductVirtualprice)
                    .HasColumnType("decimal(18,2)"); // 价格使用decimal(18,2)

                entity.Property(e => e.ProductPrice)
                    .HasColumnType("decimal(18,2)");

                entity.Property(e => e.ProductStatus)
                    .HasConversion<string>() // 枚举转换为字符串存储
                    .HasMaxLength(20);

                // 索引配置
                entity.HasIndex(e => e.ProductCode)
                    .IsUnique(); // 商品编码唯一索引

                entity.HasIndex(e => e.ProductStatus); // 状态索引

                // 导航属性配置
                entity.HasMany(e => e.ProductImages)
                      .WithOne()
                      .HasForeignKey("ProductId") // 外键
                      .OnDelete(DeleteBehavior.Cascade); // 级联删除
            });

            // 配置商品图片实体
            modelBuilder.Entity<ProductImage>(entity =>
            {
                // 主键配置
                entity.HasKey(e => e.Id);

                // 属性配置
                entity.Property(e => e.ImageUrl)
                    .IsRequired()
                    .HasMaxLength(500); // 图片URL最大长度500

                entity.Property(e => e.ImageStatus)
                    .HasMaxLength(10)
                    .HasDefaultValue("1"); // 默认状态为启用

                // 索引配置
                entity.HasIndex(e => e.ProductId); // 商品ID索引
            });
        }

        /// <summary>
        /// 保存更改 - 自动设置更新时间
        /// </summary>
        public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
        {
            // 自动设置更新时间
            var entries = ChangeTracker.Entries()
                .Where(e => e.Entity is Product &&
                           (e.State == EntityState.Modified || e.State == EntityState.Added));

            foreach (var entityEntry in entries)
            {
                ((Product)entityEntry.Entity).UpdateTime = DateTime.UtcNow;
            }

            return await base.SaveChangesAsync(cancellationToken);
        }
    }
}
